package es.acaixa.epersistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Calendar;
import java.util.List;
import java.util.Vector;

import es.acaixa.cnegocios.Funcionario;
import es.acaixa.fexcecoes.CpfInvalidoException;
import es.acaixa.fexcecoes.DataInvalidaException;
import es.acaixa.fexcecoes.FuncionarioExistenteException;
import es.acaixa.fexcecoes.FuncionarioInexistenteException;
import es.acaixa.fexcecoes.SemAniversariantesException;

public class RepositorioFuncionario {
	
	private Connection con;
	
	public RepositorioFuncionario(){
		this.con = new ConnectionFactory().getConnection();
	}
	
	public void cadastrar(Funcionario novoFuncionario) throws FuncionarioExistenteException, Exception {
		try{
			if(!consultarBooleano(novoFuncionario.getCpf())){
				String sql = "insert into funcionario (nome, cpf, datanascimento) values (?,?,?)";
				PreparedStatement stmt = con.prepareStatement(sql);
		
					if((!novoFuncionario.validaData(novoFuncionario.getDataNascimento()))){
						if((novoFuncionario.validaCpf(novoFuncionario.getCpf()))){
							stmt.setString(1, novoFuncionario.getNomeCompleto());
							stmt.setString(2, novoFuncionario.getCpf());
							stmt.setString(3, novoFuncionario.getDataNascimento());
							System.out.println("chegou na persistencia");
							stmt.execute();
							stmt.close();
						}else{
							throw new CpfInvalidoException(novoFuncionario.getCpf());
						}
					}else{
						throw new FuncionarioExistenteException(novoFuncionario.getCpf());
					}
			}
		} catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public Funcionario consultar(String cpf) throws Exception {
		Funcionario funcionario = new Funcionario();
		
		try{
			String sql = "select * from funcionario where cpf=?";
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setString(1, cpf);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				if(rs.getString("cpf").equals(cpf)){
					funcionario.setCpf(cpf);
					funcionario.setDataNascimento(rs.getString("datanascimento"));
					funcionario.setNomeCompleto(rs.getString("nome"));
					
					return funcionario;
				}else{
					throw new FuncionarioInexistenteException(cpf);
				}
			}
		} catch(SQLException e){
			throw new RuntimeException(e);
		}
		return null;
	}
	
	private boolean consultarBooleano(String cpf) throws Exception {
		try{		
			PreparedStatement stmt = con.prepareStatement("select * from funcionario where cpf=?");
			stmt.setString(1, cpf);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				if(rs.getString("cpf").equals(cpf)){
					return true;
				}else{
					throw new FuncionarioInexistenteException(cpf);
				}
			}
		} catch(SQLException e){
			throw new RuntimeException(e);
		}
		return false;
	}
	
	public void remover(String cpf) throws Exception {
		try{
			String sql = "delete from funcionario where cpf=?";
			if(consultar(cpf) != null){
				PreparedStatement stmt = con.prepareStatement(sql);
				stmt.setString(1, cpf);
				
				stmt.execute();
				stmt.close();
			}else{
				throw new FuncionarioInexistenteException(cpf);
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
	
	public void atualizar(Funcionario novoFuncionario, String cpf) throws Exception {
		try{
			String sql = "update funcionario set cpf=?, nome=?, datanascimento=? where cpf=?";
			
			if(consultarBooleano(cpf)){
				if(!novoFuncionario.validaData(novoFuncionario.getDataNascimento())){
					PreparedStatement stmt = con.prepareStatement(sql);
					stmt.setString(1, novoFuncionario.getCpf());
					stmt.setString(2, novoFuncionario.getNomeCompleto());
					stmt.setString(3, novoFuncionario.getDataNascimento());
					stmt.setString(4, cpf);
					stmt.execute();
					stmt.close();
				}else{
					throw new DataInvalidaException(novoFuncionario.getDataNascimento());
				}
			}else{
				throw new FuncionarioInexistenteException(cpf);
			}
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}

	public List<Funcionario> listar() {
		List<Funcionario> arrayFuncionarios = new Vector<Funcionario>();
		
		try{
			String sql = "select * from funcionario";
			PreparedStatement stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				Funcionario funcionario = new Funcionario();
				funcionario.setCpf(rs.getString("cpf"));
				funcionario.setDataNascimento(rs.getString("datanascimento"));
				funcionario.setNomeCompleto(rs.getString("nome"));
				arrayFuncionarios.add(funcionario);
			}
			rs.close();
			stmt.close();
			return arrayFuncionarios;
		}catch (SQLException e){
			throw new RuntimeException(e);
		}
	}

	private int getMesAtual(){
		Calendar cal = Calendar.getInstance();
		Date data = new Date(0);
		cal.setTime(data);
		int mes = cal.get(Calendar.MONTH);
		System.out.println(mes);
		return mes;
	}
	
	public List<Funcionario> listarAniversariantes() throws SemAniversariantesException {
		List<Funcionario> arrayFuncionariosAniversariantes = new Vector<Funcionario>();
		int mesAniverInt = 0;
		int mesAtual = getMesAtual();
		String data, mesAniver;
		
//		Calendar cal = Calendar.getInstance();
		
		try{
			String sql = "select * from funcionario";
			PreparedStatement stmt = con.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				data = rs.getString("datanascimento");
				System.out.println(data);
				mesAniver = data.substring(3,5);
				mesAniverInt = Integer.parseInt(mesAniver);
				
				if(mesAniverInt == mesAtual){
					Funcionario funcionario = new Funcionario();
					funcionario.setCpf(rs.getString("cpf"));
					funcionario.setDataNascimento(rs.getString("datanascimento"));
					funcionario.setNomeCompleto(rs.getString("nome"));
					arrayFuncionariosAniversariantes.add(funcionario);
				}
			}
			
			if(arrayFuncionariosAniversariantes.isEmpty()){
				throw new SemAniversariantesException();
			}
			
			rs.close();
			stmt.close();
			return arrayFuncionariosAniversariantes;
		}catch (SQLException e){
			throw new RuntimeException(e);
		}
	}


	
}
